/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import Persistencia.PersistenciaTabla;
import Persistencia.PersistenciaTruco;
import Persistencia.PersistenciaTrucoSuperado;
import Persistencia.PersistenciaUsuario;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;

/**
 *
 * @author JAVA
 */
public class Usuario {
    private String nombre;
    private String apellidos;
    private String password;
    private String email;
    private String ciudad;
    private int edad;
    private int altura;
    private double peso;
    private String sexo;
    private String estilo;
    private ArrayList<Tabla> tablas;
    private String nivel;
    private ArrayList<TrucoSuperado> trucos;
    private int ranking;
    private int puntuacion;
    private ArrayList<Usuario> usuariosQueSigue;
    private int id;
    private String rutaFoto;
    boolean baja;

    public Usuario(){
        
    }
    
    
    
    public Usuario(String nombre,String apellidos,String password, String email,String ciudad,int edad,String sexo){
        this.nombre=nombre;
        this.apellidos=apellidos;
        this.password=password;
        this.ciudad=ciudad;
        this.email=email;
        this.edad=edad;
        this.sexo=sexo;
        this.ranking=0;
        this.rutaFoto="/RedSkate/imagenes/user.png";
        this.nivel="amateur";
    }
    
    public Usuario(int id,String nombre,String apellidos,String password, String email,String ciudad,int edad){
        this.id=id;
        this.nombre=nombre;
        this.apellidos=apellidos;
        this.password=password;
        this.ciudad=ciudad;
        this.email=email;
        this.edad=edad;
        this.ranking=0;
        this.rutaFoto="RedSkate/imagenes/user.png";
        this.nivel="amateur";
    }
    
    public Usuario(int id,String nombre,String apellidos,String email,String password,int edad,double peso,int altura,String ciudad,String sexo,String estilo,String nivel,int puntuacion,int ranking,String rutaFoto){
        this.id=id;
        this.nombre=nombre;
        this.apellidos=apellidos;
        this.password=password;
        this.ciudad=ciudad;
        this.email=email;
        this.edad=edad;
        this.peso=peso;
        this.altura=altura;
        this.sexo=sexo;
        this.estilo=estilo;
        this.nivel=nivel;
        this.puntuacion=puntuacion;
        this.ranking=ranking;
        this.rutaFoto=rutaFoto;
    }
    
    public Usuario(String nombre, String apellidos,String password, String email, String ciudad, int edad, int altura, double peso, String sexo, String estilo, ArrayList<Tabla> tablas, String nivel, ArrayList<TrucoSuperado> trucos, int ranking, int puntuacion, ArrayList<Usuario> usuariosQueSigue, int id, String rutaFoto) {
        this.nombre = nombre;
        this.apellidos=apellidos;
        this.password = password;
        this.email = email;
        this.ciudad = ciudad;
        this.edad = edad;
        this.altura = altura;
        this.peso = peso;
        this.sexo = sexo;
        this.estilo = estilo;
        this.tablas = tablas;
        this.nivel = nivel;
        this.trucos = trucos;
        this.ranking = ranking;
        this.puntuacion = puntuacion;
        this.usuariosQueSigue = usuariosQueSigue;
        this.id = id;
        this.rutaFoto=rutaFoto;
    }

    public int getAltura() {
        return altura;
    }

    public void setAltura(int altura) {
        this.altura = altura;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEstilo() {
        return estilo;
    }

    public void setEstilo(String estilo) {
        this.estilo = estilo;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNivel() {
        return nivel;
    }

    public void setNivel(String nivel) {
        this.nivel = nivel;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    
    
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getPeso() {
        return peso;
    }

    public void setPeso(double peso) {
        this.peso = peso;
    }

    public int getPuntuacion() {
        return puntuacion;
    }

    public void setPuntuacion(int puntuacion) {
        this.puntuacion = puntuacion;
    }

    public int getRanking() {
        return ranking;
    }

    public void setRanking(int ranking) {
        this.ranking = ranking;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo.toUpperCase();
    }

    public ArrayList<Tabla> getTablas() {
        return tablas;
    }

    public void setTablas(ArrayList<Tabla> tablas) {
        this.tablas = tablas;
    }

    public ArrayList<TrucoSuperado> getTrucos() {
        return trucos;
    }

    public void setTrucos(ArrayList<TrucoSuperado> trucos) {
        this.trucos = trucos;
    }

    public ArrayList<Usuario> getUsuariosQueSigue() {
        return usuariosQueSigue;
    }

    public void setUsuariosQueSigue(ArrayList<Usuario> usuariosQueSigue) {
        this.usuariosQueSigue = usuariosQueSigue;
    }
    
    public String getFoto(){
        return rutaFoto;
    }
    
    public void setFoto(String foto){
        rutaFoto=foto;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 47 * hash + this.id;
        return hash;
    }

    @Override
    public String toString() {
        return "Usuario{" + "nombre=" + nombre + ", password=" + password + ", email=" + email + ", ciudad=" + ciudad + ", edad=" + edad + ", altura=" + altura + ", peso=" + peso + ", sexo=" + sexo + ", estilo=" + estilo + ", tablas=" + tablas + ", nivel=" + nivel + ", trucos=" + trucos + ", ranking=" + ranking + ", puntuacion=" + puntuacion + ", usuariosQueSigue=" + usuariosQueSigue + ", id=" + id + '}';
    }
    
    

    public int guardarUsuario(){
        int i=0;
        if(!PersistenciaUsuario.existeUsuario(this)){
            i=PersistenciaUsuario.guardarUsuario(this);
        }
        return i;
    }
    
    public int eliminarUsuario(){
        int i=0;
        if(PersistenciaUsuario.existeUsuario(this)){
            i=PersistenciaUsuario.eliminarUsuario(this);
        }
        return i;
    }
    
    public static Usuario obtenerUsuario(String email,String pass){
        return PersistenciaUsuario.obtenerUsuario(email, pass);
    }
    
    public int añadirTabla(Tabla t){
        if(!tablas.contains(t)){
            tablas.add(t);
            return PersistenciaTabla.guardarTabla(this, t);
        }
        else{
            return 0;
        }
    }
    
    public int eliminarTabla(Tabla t){
        if(tablas.contains(t)){
            tablas.remove(t);
            return PersistenciaTabla.eliminarTabla(this, t);
        }
        else{
            return 0;
        }
    }
    
    public int seguirUsuario(Usuario user){
        int i=0;
        if(!PersistenciaUsuario.esAmigo(this, user)){
            usuariosQueSigue.add(user);
            i=PersistenciaUsuario.seguirUsuario(this, user);
        }
        return i;
    }
    
    public int dejarSeguirUsuario(Usuario user){
        int i=0;
        if(PersistenciaUsuario.existeAmigo(this,user)){
            usuariosQueSigue.remove(user);
            i=PersistenciaUsuario.dejarSeguirUsuario(this, user);
        }
        return i;
    }
    
    public static ArrayList<Usuario> buscarUsuarios(String s){
        return PersistenciaUsuario.buscarUsuariosNomYApe(s);
    }
    
    public int actualizarUsuario(){
        return PersistenciaUsuario.actualizarUsuario(this);
    }
    
    public int añadirTrucoSuperado(TrucoSuperado ts){
        if(!trucos.contains(ts)){
            trucos.add(ts);
            return PersistenciaTrucoSuperado.guardarTrucoSuperado(this, ts);
        }
        else{
            return 0;
        }
    }
    
    public int actualizarTrucoSuperado(TrucoSuperado ts){
        return PersistenciaTrucoSuperado.actualizarTrucoSuperado(this, ts);
    }
    
    public ArrayList<TrucoSuperado> obtenerTrucosSuperados(){
        return PersistenciaTrucoSuperado.obtenerTrucosSuperados(this);
    }
    
    public ArrayList<Tabla> obtenerTablas(){
        return PersistenciaTabla.obtenerTablas(this);
    }
    
    public ArrayList<Usuario> obtenerUsuariosQueSigue(){
        return usuariosQueSigue;
    }
    
    
    public void compruebaSubirNivel(){
        boolean ret=false;
        if(getNivel().equalsIgnoreCase("amateur")){
            if(getPuntuacion()==500){ret= true;}            
        }
        else if(getNivel().equalsIgnoreCase("rookie")){
            if(getPuntuacion()==5500){ret= true;}
        }
        else if(getNivel().equalsIgnoreCase("skater")){
            if(getPuntuacion()==15500){ret= true;}
        }
        else if(getNivel().equalsIgnoreCase("pro")){
            if(getPuntuacion()==20000){ret= true;}
        }        
        //Si tiene lo spuntos necesarios y tiene todos los videos añadidos a los trucos sube de nivel
        if(ret && compruebaVideos()){
            subirNivel();
        }
    }
    //Comprueba si tiene todos los enlaces a los videos en los trucos superados
    public boolean compruebaVideos(){
        boolean ret=true;
        Iterator it=getTrucos().iterator();
        while(it.hasNext()){
            TrucoSuperado t=(TrucoSuperado)it.next();
            if(t.getLink()==null){
                ret=false;
            }
        }
        return ret;
    }
    
    public void subirNivel(){
        if(getNivel().equalsIgnoreCase("amateur")){
            setNivel("rookie");          
        }
        else if(getNivel().equalsIgnoreCase("rookie")){
            setNivel("skater");
        }
        else if(getNivel().equalsIgnoreCase("skater")){
            setNivel("pro");
        }
        else if(getNivel().equalsIgnoreCase("pro")){
            setNivel("extreme");
        }  
        //como hemos cambiado atributos del usuario lo actualizamos
        actualizarUsuario();
    }
    
    public TrucoSuperado obtenerTrucoId(int id){
        TrucoSuperado ts=null;
        Iterator it=getTrucos().iterator();
        while(it.hasNext()){
            TrucoSuperado t=(TrucoSuperado)it.next();
            if(t.getId()==id){
                ts=t;
            }
        }
        return ts;
    }
    
    
    
    public boolean existeEmail(){
        return PersistenciaUsuario.existeEmail(this);
    }
    
    public boolean esAmigo(Usuario u){
        return PersistenciaUsuario.existeAmigo(this,u);
    }
    
    public static Usuario obtenerUsuarioId(int id){
        return PersistenciaUsuario.obtenerUsuario(id);
    }
    
    public ArrayList<Truco> obtenerTrucosNoSuperados(){
        return PersistenciaTruco.obtenerTrucosNoSuperados(this);
    }
    
    public static ArrayList<Usuario> obtenerUsuarios(){
        return PersistenciaUsuario.obtenerTodosUsuarios();
    }
    
    public static int contadorUsuarios(){
        return PersistenciaUsuario.contadorUsuarios();
    }
    
    public static TreeSet<Usuario> obtenerUsuariosRangingPaginados(Paginacion p){
        return PersistenciaUsuario.obtenerUsuariosRankingPaginados(p);
    }
    
}
